/// <reference types="vitest" />

import { type ConfigEnv, type UserConfigExport } from "vite"
import path, { resolve } from "path"
import vue from "@vitejs/plugin-vue"
import vueJsx from "@vitejs/plugin-vue-jsx"
import { createSvgIconsPlugin } from "vite-plugin-svg-icons"
import svgLoader from "vite-svg-loader"
import UnoCSS from "unocss/vite"
import { visualizer } from "rollup-plugin-visualizer"
import { createHtmlPlugin } from "vite-plugin-html"
/** CDN配置 - 只对大型第三方库使用CDN，核心框架保留本地打包 */
const cdn = {
  // 生产环境才使用CDN
  build: {
    rollupOptions: {
      external: [
        'echarts',
        'xlsx',
        'quill',
        'highlight.js'
      ],
      output: {
        globals: {
          'echarts': 'echarts',
          'xlsx': 'XLSX',
          'quill': 'Quill',
          'highlight.js': 'hljs'
        }
      }
    }
  },
  // CDN资源
  css: [
    'https://cdn.jsdelivr.net/npm/quill@2.0.2/dist/quill.snow.css',
    'https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/styles/github.min.css'
  ],
  js: [
    // 图表库
    'https://cdn.jsdelivr.net/npm/echarts@5.6.0/dist/echarts.min.js',
    // Excel处理库
    'https://cdn.jsdelivr.net/npm/xlsx@0.18.5/dist/xlsx.full.min.js',
    // 富文本编辑器
    'https://cdn.jsdelivr.net/npm/quill@2.0.2/dist/quill.min.js',
    // 代码高亮
    'https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/lib/core.min.js',
    'https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/lib/languages/javascript.min.js',
    'https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/lib/languages/typescript.min.js',
    'https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/lib/languages/python.min.js',
    'https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/lib/languages/java.min.js',
    'https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/lib/languages/css.min.js',
    'https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/lib/languages/html.min.js'
  ]
}

/** 配置项文档：https://cn.vitejs.dev/config */
export default ({ mode }: ConfigEnv): UserConfigExport => {
  const isProd = mode === 'production'
  const useCDN = isProd && !process.env.VITE_NO_CDN

  return {
    /** 打包时根据实际情况修改 base */
    base: "./",
    resolve: {
      alias: {
        /** @ 符号指向 src 目录 */
        "@": resolve(__dirname, "./src")
      }
    },
    server: {
      /** 设置 host: true 才可以使用 Network 的形式，以 IP 访问项目 */
      host: true, // host: "0.0.0.0"
      /** 端口号 */
      port: 800,
      /** 是否自动打开浏览器 */
      open: false,
      /** 跨域设置允许 */
      cors: true,
      /** 端口被占用时，是否直接退出 */
      strictPort: false,
      /** 接口代理 */
      proxy: {
        "/api": {
            target: process.env.NODE_ENV === 'production'
          ? "http://127.0.0.1:3000"
          : "http://47.94.81.167:3000",
          ws: true,
          /** 是否允许跨域 */
          changeOrigin: true
        },
        "/music": {
          target: process.env.NODE_ENV === 'production'
            ? "http://127.0.0.1:4000" // 生产环境使用本地服务
            : "http://www.hwhanbaodan.top", // 开发环境使用远程域名（通过nginx代理）
          ws: true,
          /** 是否允许跨域 */
          changeOrigin: true
          // 开发环境不需要 rewrite，因为远程 nginx 会处理路径重写
          // 生产环境 nginx 配置：rewrite ^/music/(.*)$ /$1 break;
        },
        "/ai": {
          target: process.env.NODE_ENV === 'production'
        ? "http://127.0.0.1:5000"
        : "http://47.94.81.167:5000",
        ws: true,
        /** 是否允许跨域 */
        changeOrigin: true
      },
      },
      /** 预热常用文件，提高初始页面加载速度 */
      warmup: {
        clientFiles: ["./src/layouts/**/*.vue"]
      }
    },
    // server: {
    //   host: true, // host: "0.0.0.0"
    //   /** 端口号 */
    //   port: 80,
    //   /** 是否自动打开浏览器 */
    //   open: false,
    //   /** 跨域设置允许 */
    //   cors: true,
    //   /** 端口被占用时，是否直接退出 */
    //   strictPort: false,
    //   /** 接口代理 */
    //   proxy: {
    //     "/api": {
    //       target: "http://localhost:3000",
    //       ws: true,
    //       /** 是否允许跨域 */
    //       changeOrigin: true
    //     },
    //     "/music": {
    //       target: "http://localhost:4000",
    //       ws: true,
    //       /** 是否允许跨域 */
    //       changeOrigin: true,
    //       rewrite: (path) => path.replace(/^\/music/, "")
    //     }
    //   },
    //   /** 预热常用文件，提高初始页面加载速度 */
    //   warmup: {
    //     clientFiles: ["./src/layouts/**/*.vue"]
    //   }
    // },
    build: {
      /** 单个 chunk 文件的大小超过 2048KB 时发出警告 */
      chunkSizeWarningLimit: 2048,
      /** 禁用 gzip 压缩大小报告 */
      reportCompressedSize: false,
      /** 打包后静态资源目录 */
      assetsDir: "static",
      /** 根据是否使用CDN选择不同的构建配置 */
      ...(useCDN ? cdn.build : {
        rollupOptions: {
          output: {
            /**
             * 分块策略 - 不使用CDN时，手动分割大型库到独立chunk
             * 核心框架始终打包在本地，确保版本一致性
             */
            manualChunks: {
              // 核心框架（保持版本一致性）
              vue: ["vue", "vue-router", "pinia"],
              // UI框架
              element: ["element-plus", "@element-plus/icons-vue"],
              // 大型第三方库（独立chunk以便按需加载）
              echarts: ["echarts"],
              xlsx: ["xlsx"],
              editor: ["@vueup/vue-quill", "@kangc/v-md-editor"],
              // 工具库
              utils: ["axios", "dayjs", "lodash-es", "gsap"]
            }
          }
        }
      })
    },
    /** 混淆器 */
    esbuild:
      mode === "development"
        ? undefined
        : {
          /** 打包时移除 console.log */
          pure: ["console.log"],
          /** 打包时移除 debugger */
          drop: ["debugger"],
          /** 打包时移除所有注释 */
          legalComments: "none"
        },
    /** Vite 插件 */
    plugins: [
      vue(),
      vueJsx(),
      /** HTML插件 - CDN资源注入 */
      createHtmlPlugin({
        inject: {
          data: {
            // 根据环境注入不同的CDN资源
            VITE_CDN_CSS: useCDN ? cdn.css.map(href => `<link rel="stylesheet" href="${href}">`).join('\n    ') : '',
            VITE_CDN_JS: useCDN ? cdn.js.map(src => `<script src="${src}"></script>`).join('\n    ') : ''
          }
        }
      }),
      /** 将 SVG 静态图转化为 Vue 组件 */
      svgLoader({ defaultImport: "url" }),
      /** SVG */
      createSvgIconsPlugin({
        iconDirs: [path.resolve(process.cwd(), "src/icons/svg")],
        symbolId: "icon-[dir]-[name]"
      }),
      /** UnoCSS */
      UnoCSS(),
      /** 打包分析 */
      visualizer({
        emitFile: false,
        filename: "stats.html", //分析图生成的文件名
        open: true //如果存在本地服务端口，将在打包后自动展示
      })
    ],
    /** Vitest 单元测试配置：https://cn.vitest.dev/config */
    test: {
      include: ["tests/**/*.test.ts"],
      environment: "jsdom"
    }
  }
}
